package cn.bkrc.redis;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.Collection;
import java.util.List;

/**
 * 操作缓存中列表类型的数据
 */
@Component
public class RedisListUtils {
    @Autowired
    RedisTemplate<String,Object> redisTemplate;

    /**
     * 获取缓存中list类型的数据
     * @param key
     * @param start
     * @param stop
     * @return
     */
    public List<Object> rangeList(final String key,long start,long stop){
        return redisTemplate.opsForList().range(key,start,stop);
    }

    /**
     * 写入数据到list（一个value值）
     * @param key
     * @param value
     * @return
     */
    public boolean pushList(final String key,String value){
        boolean result=false;
        try{
            redisTemplate.opsForList().leftPush(key,value);//插入到列表的头部
            result=true;
        }catch (Exception e){
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 写入数据到list(一次放入一个集合collection)
     * @param key
     * @param collection
     * @return
     */
    public boolean pushAllList(final String key, Collection<String> collection){
        boolean result=false;
        try{
            redisTemplate.opsForList().leftPushAll(key,collection);
            result=true;
        }catch (Exception e){
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 写入list缓存（一次写入多个value）
     * @param key
     * @param vs
     * @return
     */
    public boolean pushAllList(final String key,Object... vs){
        boolean result=false;
        try{
            redisTemplate.opsForList().leftPushAll(key,vs);
            result=true;
        }catch (Exception e){
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 修改某个位置的value值
     * @param key
     * @param index
     * @param value
     * @return
     */
    public boolean setList(final String key,long index,String value){
        boolean result=false;
        try{
            redisTemplate.opsForList().set(key,index,value);//修改某个位置的value值
            result=true;
        }catch (Exception e){
            e.printStackTrace();
        }

        return result;
    }

    /**
     * 删除列表中指定位置的元素
     * @param key
     * @param l
     * @param o
     * @return
     */
    public boolean deleteList(final String key,long l,Object o){
        boolean result=false;
        try{
            redisTemplate.opsForList().remove(key,l,o);//删除指定位置的列表中的元素
            result=true;
        }catch (Exception e){
            e.printStackTrace();
        }
        return result;
    }
}